package custom.base.utils.store;

import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;

import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonParser;
import custom.base.log.MLog;

import java.util.ArrayList;
import java.util.List;
import java.util.Set;


/**
 * preference 存储管理，提供统一管理preference的地方。
 *
 * @author lorcan
 */
public class PreferencesManager<T> implements ConstantsPreference {


    private static PreferencesManager instance;

    private SharedPreferences mPrefer;
    private Editor editor;
    private Gson gson;

    public PreferencesManager(Context context) {
        mPrefer = context.getSharedPreferences(ConstantsPreference.PREFER_NAME,
                Context.MODE_PRIVATE);
        editor = mPrefer.edit();
        gson = new Gson();
    }

    public static final PreferencesManager getInstance(Context context) {
        synchronized (PreferencesManager.class) {
            if (instance == null)
                instance = new PreferencesManager(context);
            return instance;
        }
    }

    /**
     * 存放String 值
     */
    public void putString(String name, String values) {
        editor.putString(name, values);
        editor.commit();
    }

    /**
     * 存放String 值
     */
    public void putInteger(String name, int values) {
        editor.putInt(name, values);
        editor.commit();
    }

    /**
     * 存放Object 值
     */
    public void putObject(String name, Object values) {
        editor.putString(name, gson.toJson(values));
        editor.commit();
    }

    /**
     * 存放long 值
     */
    public void putLong(String name, long values) {
        editor.putLong(name, values);
        editor.commit();
    }

    /**
     * 得到xml文件中的键值对名 如果没有值则默认为“”
     */
    public String getString(String name, String defValue) {
        return mPrefer.getString(name, defValue);
    }

    /**
     * 得到xml文件中的键值对名 如果没有值则默认为“”
     */
    public long getLong(String name, long defValue) {
        return mPrefer.getLong(name, defValue);
    }

    /**
     * 得到xml文件中的键值对名 如果没有值则默认为“”
     */
    public int getInteter(String name, int defValue) {
        return mPrefer.getInt(name, defValue);
    }

    /**
     * 得到xml文件中的键值对名 如果没有值则默认为“”
     */
    public <T extends Object> T getObject(String name) {
        String tmp = mPrefer.getString(name, null);
        if (tmp != null && !tmp.isEmpty())
            try {
                return (T) gson.fromJson(tmp, Object.class);
            } catch (Exception e) {
                MLog.e(MLog.ErrorTag, tmp + "  转换类 JSON 失败-");
            }
        return null;
    }

    /**
     * 得到xml文件中的保存对象 如果没有值则默认为“”
     */
    public T getObject(String name, Class<T> tClass) {
        String tmp = mPrefer.getString(name, null);
        if (tmp != null && !tmp.isEmpty())
            return gson.fromJson(tmp, tClass);
        return null;
    }


    /**
     * 得到xml文件中的保存对象列表
     */
    public <T extends Object> List<T> getArray(String name, Class<T> cls) {
        String tmp = mPrefer.getString(name, null);
        if (tmp != null && !tmp.isEmpty()) {
            return getObjectList(tmp, cls);
        }
        return null;
    }

    public static <T> List<T> getObjectList(String jsonString, Class<T> cls) {
        List<T> list = new ArrayList<T>();
        try {
            Gson gson = new Gson();
            JsonArray arry = new JsonParser().parse(jsonString).getAsJsonArray();
            for (JsonElement jsonElement : arry) {
                list.add(gson.fromJson(jsonElement, cls));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return list;
    }

    public boolean getBoolean(String name, boolean defValue) {
        return mPrefer.getBoolean(name, defValue);
    }

    public void putBoolean(String name, boolean values) {
        editor.putBoolean(name, values);
        editor.commit();
    }

    /**
     * 存放String 值
     */
    public void putStringSet(String name, Set<String> values) {
        editor.putStringSet(name, values);
        editor.commit();
    }

    /**
     * 得到xml文件中的键值对名 如果没有值则默认为“”
     */
    public Set<String> getStringSet(String name, Set<String> defValue) {
        return mPrefer.getStringSet(name, defValue);
    }

}
